һ

      ֧ɶַǵȿʾֿ⣨ʸֿתֿ)塢ͬСĵֿ⣬ҪӦҪʾֿ֧֣ǶʽϵͳС
      ص㣺 תٶȷǳ죨뼶,֧ 16 ֿת

ʹ˵
	   1. תֿ⣬£
	      1). ѡһҪתʸļ(*.ttf)
                         Ƚc:\windows\fonts Ŀ¼µļctrl+c,Ȼѡ
                         ȥһArialUni.ttfֿ⣨ұṩĿǰlinuxϵͳõľַǳȫ档
	            صַ http://ishare.iask.sina.com.cn/f/4942778.html
	       2). ѡ(MBCS or Unicode)
	      3). ѡСĿǰֻ֧162432404856ɸĳɴ  > 56 
	      4). ѡҪתַ(ֶ֧ѡ)磺Ҫõģѡģͬʱѡ
	      5). ѡļ(BIN ļʼĬѡ
	      6). ѡĿ¼ɵļŵѡĿ¼С
	      7).  build ťԵƬ̣Ҫֿļ

	      ע⣺ ѡMBCS 뷽ʽѡַļ
	             ѡNICODE뷽ʽѡٸַֻһļ
	             
	             ֿʧܣпѡļ(*.TTF)ԭͲַַϢ 磺вںַɵֿ޷ֺ֧ʾ
	             ο취 ϵͳԴַӳͿѡͬ壬ַ򿪡߼鿴вա
	             ַӳķ
	             1. ʽпֱӼ "charmap"ɡ
	             2. -->-->ϵͳ--->ַӳ
	    
	   2. ֿԤ£
	      1). ѡһҪԤֿļ*.binԶ򿪷ͣСַ
	      2).  goto codeı༭УҪ鿴ַı(ǰѡֿ*.BIN unicode룬unicode룬mbcs 룩س󼴿ɿʾЧɵַ֪ʵʾȡ
	 
	          ⣬֧Ԥ ϶ԷŴСԤЧ
	        
	   3. ע  

	      ûע£ֻ֧16ֿתע֧2432404856 ɸҪ޸ĵ֧塣

	      ע᷽  "Aoubt..." ťᵯһԻٵ "ע..." ťʾɡ	 		




     1.֧ windows ַ£

	CP932,    Shift-JIS 磺
	CP936,    GBK   磺(л񹲺͹), (ر), (¼)
	CP949,    ģ          磺    
	CP950,    Big5  磻(̨), (ر)
	CP874,    ̩ģ          磺̩
	CP1250,   ŷ          磺ݿ,,,,޵,˹工,,˹,ά()
	CP1251,   ģ      磺,,ڿ,ʱ,(FYROM),,˹,,ɹ,ݽ,ȱ,ά
	CP1252,   ŷ(I) 磺̩¡,,,Ӣ,,,,,,,Ų,,ӡ,ʿ,Ϸ,,,˹ϣ,,
	CP1253,   ϣģ 			  磺ϣ  
	CP1254,   ģ      磺,ݽ,ȱ
	CP1255,   ϣģ      磺ϣ  
	CP1256,   ģ      磺ڶ,˹,(,,,,Ħ,ͻ˹,,Ҳ,,Լ,,,,,)
	CP1257,   ޵ĺģ    磺ɳ,ά,
	CP1258,   Խϣ          磺Խ
	unicode   ַɺϳɡ

     2. ֧ BIN(*.bin), TXT(*.txt), BMP(*.bmp) ļ

      A. BIN ļֿļɣ洢ҪõĵֿϢļṹĴ󲿷ɣļͷϢϢ

	     1). ļͷָļǰʮֽڣBYTE),Ϣ½ṹ

	  typedef struct tagFontLibHeader{
			BYTE	magic[4];	//'U'(or 'M'), 'F', 'L', X        'U'(or 'M')---Unicode(or MBCS) Font Library, X: ʾ汾. ָߵ4λ 0x12ʾ Ver 1.2
			DWORD Size;			/* File total size */
			BYTE	nSection; //MBCS:Ƿ Unicodeּ
			BYTE	YSize;    /* height of font  */  			
			WORD	wCpFlag;    // codepageflag:  bit0~bit13 ÿbitֱһCodePage ־1ʾǰCodePage ѡΪѡ
			char	reserved[4];	  // Ԥֽ	
		} FL_Header;
			
	     2). Ϣֻ UNICODE ЧռֽnSection*sizeof(FL_SECTION_INF)ṹ£

		typedef struct tagFlSectionInfo{
			WORD  First;         /* first character               */
			WORD  Last;          /* last character                */
			DWORD OffAddr;      /* ָǵǰSECTION UFL_CHAR_INFOһַϢʼַ */
		} FL_SECTION_INF, *PFL_SECTION_INF;
				
			
	     3). ֻԷǵȿMBCSССġģЩȿ UNICODE ֿЧ

		typedef struct tagUflCharInfo{
			#ifdef	SUPPORT_MAX_FONT        // ôṹ֧248
				DWORD	 OffAddr;      // ǰַݵʼַ
				BYTE	 Width;       // ַصĿ
			#else
				DWORD	 OffAddr	: 26;      // ǰַݵʼַ
				DWORD	 Width	: 6;       // ַصĿ( Ŀǰ֧ 56 
			#endif
		} UFL_CHAR_INDEX;

		ǷǵȿMBCSֿ⣬ռֽΪ0xff * sizeofUFL_CHAR_INDEX
		Unicodeֿ⣬ռֽΪ((xxx[0].Last - xxx[0].First + 1)+...+(xxx[nSection-1].Last - xxx[nSection-1].First + 1)) * sizeofUFL_CHAR_INDEX;
				
	     4). ϢǰаַַĵϢϡݴ洢ʽΪߵλ洢磺 10110011 00011010 Ϊ B3. 1A
			 
	     
           磺ʾ code = xxxx ַΪֱ£
				 
		    (1). ǵȿMBCSֿ
		            a. ȶFL_HeaderϢ
		            b. sizeofFL_Header + code * 2ҵcode UFL_CHAR_INDEXϢ
		            c. UFL_CHAR_INDEXOffAddrҵǰcodeĵϢ
		            d. FL_Header.YsizeUFL_CHAR_INDEX.WidthԼϢshowǰַ
		    (2). ȿ MBCSֿ ССġģ
		            a. ȶFL_HeaderϢ
       		      b. codeڵǰַеֵindexȻsizeofFL_Header + index * (FL_Header.Ysize/8*FL_Header.Ysize)ҵcodeĵϢ
       		      c. ȻFL_Header.YsizeϢshowǰַ
			       			
			  ǰcode㵱ǰַcodepageλ,ֵ˺ҪMBCSеļУУģģ
			  static long GetPosWithMbcs(UINT code, UINT codepage)
			  {
				long lIdx = -1;
							
				BYTE R = (code >> 8) & 0xFF;   //
				BYTE C = code & 0xFF;   //λ
									
				switch(codepage)
				{
				case CP932:    // 
					if(R >= 0x81 && R <= 0x9F)
					{
						if(C >= 0x40 && C <= 0x7E)
							lIdx = (R-0x81)*188 + (C-0x40);  //188 = (0x7E-0x40+1)+(0xFC-0x80+1); 			
						else if(C >= 0x80 && C <= 0xFC)
							lIdx = (R-0x81)*188 + (C-0x80)+63;  // 63 = 0x7E-0x40+1;			
					}
					else if(R >= 0xE0 && R <= 0xFC)
					{
						if(C >= 0x40 && C <= 0x7E)
							lIdx = 5828 + (R-0xE0)*188 + (C-0x40);  // 5828 = 188 * (0x9F-0x81+1);
						else if(C >= 0x80 && C <= 0xFC)
							lIdx = 5828 + (R-0xE0)*188 + (C-0x80)+63;
					}
					break;
									
				case CP936:       // 
					if((R >= 0xA1 && R <= 0xFE) && (C >= 0xA1 && C <= 0xFE))
						lIdx = (R-0xa1)*94 + (C-0xa1);  //94 = (0xFE-0xA1+1); 
					break;
									
				case CP949:       // 
					if(R >= 0x81)
					{
						if(C >= 0x41 && C <= 0x7E)
							lIdx = ((R-0x81) * 188 + (C - 0x41));   // 188 = (0x7E-0x41+1)+(0xFE-0x81+1);
						else if(C >= 0x81 && C <= 0xFE)
							lIdx = ((R-0x81) * 188 + (C - 0x81) + 62);  // 62 = (0x7E-0x41+1);
					}
					break;
									
				case CP950:        // 
					if(R >= 0xA1 && R <= 0xFE) 
					{
						if(C >= 0x40 && C <= 0x7E)
							lIdx = ((R-0xa1)*157+(C-0x40));   // 157 = (0x7E-0x40+1)+(0xFE-0xA1+1);
						else if(C >= 0xA1 && C <= 0xFE)
							lIdx = ((R-0xa1)*157+(C-0xa1)+63);  // 63 = (0x7E-0x40+1);
					}
					break;
				default:
					break;
				}
				return lIdx;
			}
			       			
		    (3). Unicodeֿ ԰ַ
		         a. ȶFL_HeaderϢ
		         b. ǰַڵڼ,ڵnΣͿɸxxx[n].OffAddr+code - xxx[n].First* sizeofUFL_CHAR_INDEXҵַϢ(UFL_CHAR_INDEX)
		         c. UFL_CHAR_INDEXOffAddrҵǰcodeĵϢ
	           d. FL_Header.YsizeUFL_CHAR_INDEX.WidthԼϢshowǰַ
			       			
			
	    B. TXT ļѡɣ 洢ǵǰַֿģʾЧת

	    C. BMP ļѡɣ ǽǰַֿϢϳɵһλͼļֻ MBCS Чת
	    
	    
		 
ġδֿļ*.bin)лȡϢ

		ѡıͣMBCS  UnicodeԼַֿͬļݶҲ᲻ͬ

    ݶ         MBCS-CJK         MBCS-ǵȿ          Unicode
    -------------------------------------------------------------------
    ļͷ            Y                Y                    Y
    Ϣ            N                N                    Y
                N                Y                    Y
    Ϣ          Y                Y                    Y
    
    Y:             
    N 

עͣ 
   MBCS: MultiByteCharsetַַֽ 
   CJK ChinaJapanKoreaУ壬壩պַ
   ǵȿ ÿַʾȲȡ ַ'i''M'  CJK ⣬ĬΪǵȿַ
   Unicode: ͳһ루ַֽ
   
£

    ע⣺
    a. ݶǵλǰλں 
    b. ߶Ϊλ
    c. ַӵ͵˳ֱΪģУģУ̩ģŷŷϣģϣģģ޵ĺģԽģ
    
		A. MBCS-CJK (ȿ
		
		00000000h: 4D 46 4C 10 50 FE 03 00 00 10 02 00 00 00 00 00 
		00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000040h: 00 00 00 00 30 00 18 00 0C 00 04 00 00 00 00 00
		...
		
		£
		1. ļͷ ( ǰ 16 Byte 
    
    4D 46 4C 10 -- ʶͷжǷΪϷֿļ     
                   4D = 'M' ʾļΪ MBCS ʽֿļ
                   46 = 'F' 4C = 'L'
                   10 ʾֿļ汾ϢΪ Version 1.0
    50 FE 03 00 -- ļܳ
    00          -- Ƿ 0-ʶ޼
    10          -- ߶ ߶Ϊλ 0x10 == 16
    02 00       -- ѡַ־λ 1-ʶѡ 0-ʶδѡ.   ʵóǰѡΪ ַ
    00 00 00 00 -- Ԥֽ    
     	
   	2). Ϣ
   	ΪGB2312 ׸ַ0xA1A1 ĵʼַΪ 0x10ݳΪ߶+7/8* ߶ = ((16+7/8)*16 = 32.
   	ȡ 16 ֽڣΪַ0xA1A1ĵϢ
   	00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   	
   	ͬ¼Ϊַ0xA1A2ĵϢ 
   	00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000040h: 00 00 00 00 30 00 18 00 0C 00 04 00 00 00 00 00
    
    
    ڵȿַĵݳȶΪ߶+7/8* ߶  = 
		
		
	  B. MBCS-ǵȿ 
    Sample Ŀ¼µļarialuni16_CP1252.bin, ļ£
    
    00000000h: 4D 46 4C 10 90 1A 00 00 01 10 80 00 00 00 00 00 
    00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000060h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000070h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000080h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000090h: 10 04 00 10 20 04 00 10 30 04 00 18 40 04 00 24
    ...
    00000410h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000420h: 00 00 40 40 40 40 40 40 40 40 00 40 40 00 00 00
    ....
    
    £ 
    1. ļͷ ( ǰ 16 Byte 
    
    4D 46 4C 10 -- ʶͷжǷΪϷֿļ     
                   4D = 'M' ʾļΪ MBCS ʽֿļ
                   46 = 'F' 4C = 'L'
                   10 ʾֿļ汾ϢΪ Version 1.0
    90 1A 00 00 -- ļܳ
    01          -- Ƿ 1-ʶм
    10          -- ߶  0x10 == 16
    80 00       -- ѡַ־λ 1-ʶѡ 0-ʶδѡ. ʵóǰѡΪ ŷַ
    00 00 00 00 -- Ԥֽ
    
    2.  
     00000010h ʼÿ 4 ֽڱʾһַļϢ Ҵַ 0x0 ʼʿոַ' 'ļϢ00000090hΪ10 04 00 10
    óһ 32 λΪ 0x10000410ʮƣ --- 00010000 00000000 00000100 00010000. 
     6 λʾǰַĿȡ ʵó 000100 -- 4 ֿΪ 4 
     26 λ ʾַĵϢƫƵַʵó 00 00000000 00000100 00010000 -- 0x410 ϢʼַΪ 0x410)
   	
   	3). Ϣ
   	ڿոַʼַΪ 0x410ݳΪ+7/8* ߶ = ((4+7/8)*16 = 16.
   	ȡ 16 ֽڣΪոַĵϢ
   	00000410h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   	
   	ͬ¼Ϊַ'!' ĵϢ 
   	00000420h: 00 00 40 40 40 40 40 40 40 40 00 40 40 00 00 00
   	
   	
   	C. Unicode  (ļ .\Demo\ReadUnicode.c
   	
   	00000000h: 55 46 4C 10 28 AB 07 00 01 10 81 00 00 00 00 00 
    00000010h: 20 00 FF FF 18 00 00 00 98 FF 03 10 A8 FF 03 10
    ...
    0003ff90h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    0003ffa0h: 00 00 00 00 00 00 00 00 00 00 40 40 40 40 40 40
    0003ffb0h: 40 40 00 40 40 00 00 00 00 00 48 48 48 48 00 00
    ...
   
      
    £ 
    1. ļͷ ( ǰ 16 Byte 
    
    55 46 4C 10 -- ʶͷжǷΪϷֿļ     
                   55 = 'U' ʾļΪ UNICODE ʽֿļ
                   46 = 'F' 4C = 'L'
                   10 ʾֿļ汾ϢΪ Version 1.0
    28 AB 07 00 -- ļܳ
    01          -- Section 1- 1 Section (  ڲCJKʱֳ3 Section
    10          -- ߶  0x10 == 16
    81 00       -- ѡַ־λ 1-ʶѡ 0-ʶδѡ. ʵóǰѡΪ +ŷַ
    00 00 00 00 -- Ԥֽ
    
    2. Ϣ (n section * sizeof(FL_SECTION_INF) = 1 * 8 = 8))
    20 00 -- First character
    FF FF -- Last character
    18 00 00 00 -- OffAddr;      /* ָǵǰSECTIONFirst characterӦ UFL_CHAR_INDEXϢʼַ */    
    
    3.  (Section[0].Last - Section[0].First + 1) * 4 + (Section[n-1].Last - Section[n-1].First + 1) * 4)
    ÿ 4 ֽڱʾһַļϢ ҴַSection[0].First ʼַ0x20ļϢʼַ = 
    ַunicode - Section[x].First  4 + Section[x].OffAddr,  x ΪǰַڵsectionֵжϵóΪ98 FF 03 10
    óһ 32 λΪ 0x1003FF98ʮƣ --- 00010000 00000011 11111111 10011000. 
     6 λʾǰַĿȡ ʵó 000100 -- 4 ֿΪ 4 
     26 λ ʾַĵϢƫƵַʵó 00 00000011 11111111 10011000 -- 0x3FF98 ϢʼַΪ 0x3FF98)
   	
   	3). Ϣ
   	ڿոַʼַΪ 0x3FF98ݳΪ+7/8* ߶ = ((4+7/8)*16 = 16.
   	ȡ 16 ֽڣΪոַĵϢ
   	0003ff98h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   	
   	ͬ¼Ϊַ0x21 ĵϢ 
   	0003ffA8h: 00 00 40 40 40 40 40 40 40 40 00 40 40 00 00 00
   	
                   
   

	Ըܸһʣв׵ĵطԸҷʼл
		
	==================================================================================
            
				  ܰɹ

			    MAIL: 9599598@qq.com; wujianguo789@126.com

			    MSN: wujianguo19@hotmail.com
								
                                              BLOG: http://blog.sina.com.cn/wujianguo789 ( 汾£ڴ˴ʾ
			    










